www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/GameLib/Graphics/Font.cpp
//Download by http://www.NewXing.com ///////////////// // Font.h : 设置字体 // // 版本0010 : 二零零三年七月四日 // // written by : Huang LunXin // // Compiler : Visual C++ 6.0 // // Copyright : IcePoint 2003 ///////////////// // 此文件用来设置字体 #include "Font.h" #include "..\\define.h" #include "..\\globle_func.h" CFont::CFont() { m_font=NULL; m_fontHeight=0; } CFont::~CFont() { } void CFont::Init() { m_font=NULL; m_fontSave=NULL; m_fontHeight=0; } bool CFont::UseFont(HDC hdc,int iFontStyle,int iSize,int nWeight,bool bItalic,bool bUnderline) { switch(iFontStyle) { case DCF_TITLE: m_font=CreateFont(128,0,0,0, 800, TRUE, FALSE, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, "宋体"); break; case DCF_USERDEFINE: m_fontHeight=iSize; m_font=CreateFont(iSize,0,0,0, nWeight, bItalic, bUnderline, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, "宋体"); break; case DCF_NOMAL: default: m_font=CreateFont(16,0,0,0, 400, FALSE, FALSE, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_SWISS, "宋体"); break; } if(!m_font) { MsgBox("Create Font Failed!"); return false; } m_fontSave=(HFONT)::SelectObject(hdc,m_font); return true; } void CFont::RestoreFont(HDC hdc) { ::DeleteObject(::SelectObject(hdc,m_fontSave)); } int CFont::GetFontHeight(int iFontStyle) { switch(iFontStyle) { case DCF_TITLE: return 80; break; case DCF_USERDEFINE: return m_fontHeight; break; case DCF_NOMAL: default: return 16; break; } return 0; } /* void CIme::lpList() { DisableIme(); // 通过DisableIme初始化一些数据 } CIme::~CIme() { DisableIme(); if( lpList() ) { free( (HANDLE)lpStandardList ); lpStandardList = NULL; } } void CIme::DisableIme() { while( ImmIsIME( GetKeyboardLayout( 0 ))) ActivateKeyboardLayout(( HKL )HKL_NEXT, 0 ); // 如果IME打开通过循环切换到下一个关闭 bImeIsAble = false; szConvertedStr[ 0 ] = 0; szInputStr[ 0 ] = 0; nImeCursor = 0; szImeName[ 0 ] = 0; szSelectList[ 0 ] = 0; } void CIme::EnableIme() { bImeIsAble = true; } void CIme::NextIme() { if( !bImeIsAble ) return; ActivateKeyboardLayout(( HKL )HKL_NEXT, 0 ); } void CIme::SharpIme( HWND hWnd ) { ImmSimulateHotKey( hWnd, IME_CHOTKEY_SHAPE_TOGGLE ); } void CIme::SymbolIme( HWND hWnd ) { ImmSimulateHotKey( hWnd, IME_CHOTKEY_SYMBOL_TOGGLE ); } void CIme::ConvertList( CANDIDATELIST *pList, char *pszList ) { // 转换CandidateList到一个串,\t分隔每一项 unsigned int i; if( pList->dwCount < pList->dwSelection ) { pszList[ 0 ] = 0; return; } for( i = 0; ( i < pList->dwCount - pList->dwSelection )&&( i < pList->dwPageSize ); i++ ) { *pszList++ = ( i % 10 != 9 )? i % 10 + '1' : '0'; // 每项对应的数字键 *pszList++ = '.'; // 用'.'分隔 strcpy( pszList, (char*)pList + pList->dwOffset[ pList->dwSelection + i ] ); // 每项实际的内容 pszList += strlen( pszList ); *pszList++ = '\t'; // 项之间以'\t'分隔 } *( pszList - 1 )= 0; // 串尾,并覆盖最后一个'\t' } bool CIme::OnWM_INPUTLANGCHANGEREQUEST() { return !bImeIsAble; // 如果禁止IME则返回false,此时窗口函数应返回0,否则DefWindowProc会打开输入法 } bool CIme::OnWM_INPUTLANGCHANGE( HWND hWnd ) { // IME改变 HKL hKL = GetKeyboardLayout( 0 ); if( ImmIsIME( hKL )) { HIMC hIMC = ImmGetContext( hWnd ); ImmEscape( hKL, hIMC, IME_ESC_IME_NAME, szImeName ); // 取得新输入法名字 DWORD dwConversion, dwSentence; ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence ); bImeSharp = ( dwConversion & IME_CMODE_FULLSHAPE )? true : false; // 取得全角标志 bImeSymbol = ( dwConversion & IME_CMODE_SYMBOL )? true : false; // 取得中文标点标志 ImmReleaseContext( hWnd, hIMC ); } else // 英文输入 szImeName[ 0 ] = 0; return false; // 总是返回false,因为需要窗口函数调用DefWindowProc继续处理 } bool CIme::OnWM_IME_NOTIFY( HWND hWnd, WPARAM wParam ) { HIMC hIMC; DWORD dwSize; DWORD dwConversion, dwSentence; switch( wParam ) { case IMN_SETCONVERSIONMODE: // 全角/半角,中/英文标点改变 hIMC = ImmGetContext( hWnd ); ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence ); bImeSharp = ( dwConversion & IME_CMODE_FULLSHAPE )? true : false; bImeSymbol = ( dwConversion & IME_CMODE_SYMBOL )? true : false; ImmReleaseContext( hWnd, hIMC ); break; case IMN_OPENCANDIDATE: // 进入选字状态 case IMN_CHANGECANDIDATE: // 选字表翻页 hIMC = ImmGetContext( hWnd ); if( lpList ) { GlobalFree( (HANDLE)lpList ); lpList = NULL; } // 释放以前的选字表 if( dwSize = ImmGetCandidateList( hIMC, 0, NULL, 0 )) { lpList = (LPCANDIDATELIST)GlobalAlloc( GPTR, dwSize ); if( lpList ) ImmGetCandidateList( hIMC, 0, lpList, dwSize ); } // 得到新的选字表 ImmReleaseContext( hWnd, hIMC ); if( lpList ) ConvertList( lpList, szSelectList ); // 选字表整理成串 break; case IMN_CLOSECANDIDATE: // 关闭选字表 if( lpList ) { GlobalFree( (HANDLE)lpList ); lpList = NULL; } // 释放 szSelectList[ 0 ] = 0; break; } return true; // 总是返回true,防止IME窗口打开 } bool CIme::OnWM_IME_COMPOSITION( HWND hWnd, LPARAM lParam ) { // 输入改变 HIMC hIMC; DWORD dwSize; hIMC = ImmGetContext( hWnd ); if( lParam & GCS_COMPSTR ) { dwSize = ImmGetCompositionString( hIMC, GCS_COMPSTR, (void*)szConvertedStr, sizeof( szConvertedStr )); szConvertedStr[ dwSize ] = 0; } // 取得szCompStr if( lParam & GCS_COMPREADSTR ) { dwSize = ImmGetCompositionString( hIMC, GCS_COMPREADSTR, (void*)szInputStr, sizeof( szInputStr )); szInputStr[ dwSize ] = 0; } // 取得szCompReadStr if( lParam & GCS_CURSORPOS ) { nImeCursor = 0xffff & ImmGetCompositionString( hIMC, GCS_CURSORPOS, NULL, 0 ); } // 取得nImeCursor if( lParam & GCS_RESULTSTR ) { unsigned char str[ MAX_PATH ]; dwSize = ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void*)str, sizeof( str )); // 取得汉字输入串 str[ dwSize ] = 0; unsigned char *p = str; while( *p )PostMessage( hWnd, WM_CHAR, (WPARAM)(*p++), 1 ); // 转成WM_CHAR消息 } ImmReleaseContext( hWnd, hIMC ); return true; // 总是返回true,防止IME窗口打开 } char* CIme::GetImeName() { return szImeName[ 0 ]? szImeName : NULL; } bool CIme::IfImeSharp() { // 是否全角 return bImeSharp; } bool CIme::IfImeSymbol() { // 是否中文标点 return bImeSymbol; } void CIme::GetImeInput( char **pszCompStr, char **pszCompReadStr, int *pnImeCursor, char **pszCandList ) { if( pszCompStr ) *pszCompStr = szConvertedStr; if( pszCompReadStr ) *pszCompReadStr = szInputStr; if( pnImeCursor ) *pnImeCursor = nImeCursor; if( pszCandList ) *pszCandList = szSelectList; } */